﻿using Jodo.Numerics;
using System;
using System.Collections.Generic;
using System.Text;

namespace MyGrid.Core.HexTypeA.Visual
{
    public class HexTypeALocator
    {
        /// focusCenter 聚焦中心，位于聚焦中心的单位的最后渲染结果会是(0,0)，这算是某种偏移。
        /// unitSize 指的是一个六边形的单边长，也就是一个六边形的小半径。
        public static MGVector2F GetVisualPosition(MGVector2I vector, float finalUnitSize, MGVector2F focusCenter)
        {
            var rpos = GetRowPos(vector.Y, finalUnitSize);
            var cpos = GetColunmPos(vector.X, vector.Y, finalUnitSize);

            return new MGVector2F(cpos - focusCenter.X, rpos - focusCenter.Y);

        }

        /// focusCenter 聚焦中心，位于聚焦中心的单位的最后渲染结果会是(0,0)，这算是某种偏移。
        /// unitSize 指的是一个六边形的单边长，也就是一个六边形的小半径。
        public static MGVector2F GetVisualPosition(MGVector2I vector, float unitSize, float zoomScale, MGVector2F focusCenter)
        {
            var finalUnitSize = unitSize * zoomScale;
            return GetVisualPosition(vector, finalUnitSize, focusCenter);
        }

        ///<summary>计算得到TypeA类型的网格位置。</summary>
        private static float GetRowPos(int yId, float finalUnitSize)
        {
            if (yId % 2 == 0)
            {
                return yId / 2 * 3 * finalUnitSize;
            }
            else if (yId > 0)
            {
                return ((yId - 1) / 2 * 3 + 1.5f) * finalUnitSize;
            }
            else
            {
                return ((yId + 1) / 2 * 3 - 1.5f) * finalUnitSize;
            }
        }

        private static float GetColunmPos(int xId, int yId, float finalUnitSize)
        {
            if (yId % 2 == 0)
            {
                return xId * finalUnitSize * MathExtensions.Sqrt3;
            }
            else
            {
                return (xId - 0.5f) * finalUnitSize * MathExtensions.Sqrt3;
            }
        }
    }
}
